/*
 Copyright (c) [Year] [name of copyright holder]
 [Software Name] is licensed under Mulan PSL v2.
 You can use this software according to the terms and conditions of the Mulan
 PSL v2.
 You may obtain a copy of Mulan PSL v2 at:
          http://license.coscl.org.cn/MulanPSL2
 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
 KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 See the Mulan PSL v2 for more details.
*/

#ifndef _1988WJ_PASTEMODULE_HPP_
#define _1988WJ_PASTEMODULE_HPP_

#include "PasteAdjustImg.hpp"
#include "PasteConvert.hpp"
#include "PasteDB.hpp"
#include "PasteIO.hpp"
// #include "PasteThreadPool.hpp"
#include <chrono>
#include <format>
#include <thread>

namespace fs = std::filesystem;

class PasteModule {
  private:
    struct ProductInfo {
        int Int0 = 0;           // 编号
        int Int1 = 0;           // 尺寸1(um)
        int Int2 = 0;           // 尺寸2(um)
        int Int4 = 0;           // 质量(mg)
        int Int6 = 0;           // 类型
        std::string ID2 = "";   // 客户
        std::string ID1 = "";   // 开发人员
        std::string Str5 = "";  // 关键字
        std::string Str6 = "";  // 备注说明
        std::string Str4 = "";  // 重复数据差异暂存区域
        std::string Time0 = ""; // 创建时间
    };

  public:
    /**
     * @brief 图像处理函数
     *
     * 本函数负责对指定目录下的图像进行处理，可以根据需求选择自动或手动调整图像。
     * 以及基于一个基础编号，对图像进行统一编码。
     * 通过它来实现图像的批量处理和个性化处理需求。
     *
     * @param dir 图像文件所在的目录路径
     * @param imgExt 图像文件的扩展名(带点: .jpg, .bmp等)，用于识别和处理特定类型的图像文件
     * @param baseNum 基础编号，用于在处理过程中对图像进行统一命名编号
     * @param isManual 是否需要手动调整图像，true为手动，false为自动
     * @return int 返回图像处理的结果代码，0表示成功，非0表示失败
     */
    static int ImgProcess(const std::string &dir, const std::string &imgExt, const int baseNum, const bool isManual);

    /**
     * @brief 保存图片信息
     *
     * 该函数用于将分割后的图片信息保存到数据库中。它根据给定的连接字符串、目录、图片扩展名，
     * 以及相关的数字ID，执行保存操作。这个函数主要是为了解决图片信息的持久化问题，
     * 确保图片能够被正确地记录和追踪。
     *
     * @param connStr 数据库连接字符串，用于建立与数据库的连接
     * @param dir 图片保存的目录路径，确保路径存在且有写入权限
     * @param imgExt 图片扩展名，用于指定处理图片的格式
     * @param baseNum 基础编号，用于生成图片的统一唯一标识
     * @param categoryID 类别ID，用于对图片进行分类管理
     * @param materialID 材质ID，关联到使用的材质记录
     * @return int 返回操作结果，0表示成功，非0表示失败
     */
    static int SaveImgInfo(const PasteDB::ConnStruct &connStr, const std::string &dir, const std::string &imgExt,
                           const int baseNum, const int categoryID, const int materialID);

    // 产品信息处理
    static int ProductProcess(const PasteDB::ConnStruct &connStr, const std::string &path);

    // 整合产品信息和图片信息
    static int ProductImgIntegration(const PasteDB::ConnStruct &connStr, const std::string &dir, const std::string &imgExt,
                                     const int baseNum, const int categoryID, const int materialID,
                                     const std::string &categoryName);

    /**
     * @brief 执行图像缩放操作
     *
     * 根据给定的目录和图像文件扩展名，查找并处理该目录下所有的对应图像文件。
     * 缩放操作的具体实现细节和逻辑处理过程需要根据实际代码内容进行分析。
     *
     * @param dir 图像文件所在的目录路径
     * @param imgExt 图像文件的扩展名，用于识别图像文件类型
     * @return int 缩放操作的结果，通常0表示成功，非0表示失败
     */
    static int ImgShrink(const std::string &dir, const std::string &imgExt);
};
#endif